using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using 凌依.Xml;

public class 地图参数 : 单例_基础管理器<地图参数>
{
    private string path;
    private Xml文档工具 xml;
    public 地图参数包裹 参数信息;
    public 地图参数()
    {
        path = "数据/XML数据/地图生成/地形参数";
        xml = new Xml文档工具(资源管理器.获取实例.加载<TextAsset>(path).text);
    }

    public 地图参数包裹 获取基础地图参数(UnityAction 加载完成)
    {
        if (参数信息 != null)
            return 参数信息;

        地图参数包裹 va = new 地图参数包裹();
        Xml节点 参数根节点 = xml.根节点.查找节点("生成参数[@ID='基础地图']");
        Xml节点 属性节点 = 参数根节点.查找节点("属性");
        float 获取参数(string 参数名) => float.Parse(属性节点.获取节点属性(参数名));

        va.山地地形截取高度 = 获取参数("山地地形截取高度");
        va.山体截取高度 = 获取参数("山体截取高度");
        va.生态群落截取高低 = 获取参数("生态群落截取高低");
        va.矿物高度截取 = 获取参数("矿物高度截取");
        va.森林截取高度 = 获取参数("森林截取高度");
        va.大水湖高点 = 获取参数("大水湖高点");
        va.小水湖高点 = 获取参数("小水湖高点");
        va.森林地表矿高点 = 获取参数("森林地表矿高点");


        Xml节点 矿物属性 = 参数根节点.查找节点("矿物属性");
        int 总数 = 0;
        va.矿物生成参数 = new 生成属性_集合();
        foreach (var item in 矿物属性)
        {
            Xml节点 jd = item as Xml节点;
            va.矿物生成参数.集合.Add(new 生成属性(jd.节点名称, jd.节点值.ToInt()));
            总数 += jd.节点值.ToInt();
        }
        va.矿物生成参数.上限 = 总数;
        va.矿物生成参数.name = "矿物属性";


        Xml节点 植物属性 = 参数根节点.查找节点("生态属性");
        va.生态道具生成集合 = new List<生成属性_集合>();
        foreach (var item in 植物属性)
        {
            Xml节点 jd = item as Xml节点;
            生成属性_集合 ls = new 生成属性_集合();
            ls.name = jd.节点名称;
            总数 = 0;
            foreach (var 节点 in jd)
            {
                Xml节点 jd2 = 节点 as Xml节点;
                ls.集合.Add(new 生成属性(jd2.节点名称, jd2.节点值.ToInt()));
                总数 += jd2.节点值.ToInt();
            }
            ls.上限 = 总数;
            va.生态道具生成集合.Add(ls);
        }

        Xml节点 特殊地形 = 参数根节点.查找节点("特殊地形");
        va.生态地形生成参数 = new 生成属性_集合();
        总数 = 0;
        foreach (var item in 特殊地形)
        {
            Xml节点 jd = item as Xml节点;
            va.生态地形生成参数.集合.Add(new 生成属性(jd.节点名称, jd.节点值.ToInt()));

            总数 += jd.节点值.ToInt();
        }
        va.生态地形生成参数.上限 = 总数;


        List<噪声参数> 获取数据(string 参数名)
        {
            Xml节点 节点 = 参数根节点.查找节点($"噪声参数[@ID='{参数名}']");
            List<Xml节点> xmls = 节点.查找节点_All("列表");
            List<噪声参数> 返回 = new List<噪声参数>();
            foreach (var item in xmls)
            {
                噪声参数 a = new 噪声参数();
                a.噪声缩放 = float.Parse(item.查找节点("噪声缩放").节点值);
                a.高度 = float.Parse(item.查找节点("高度").节点值);
                a.叠加次数 = int.Parse(item.查找节点("叠加次数").节点值);
                a.粗糙度 = float.Parse(item.查找节点("粗糙度").节点值);
                a.保留振幅 = float.Parse(item.查找节点("保留振幅").节点值);
                返回.Add(a);
            }
            return 返回;
        }


        va.山地群落 = 获取数据("山地群落");
        va.山体参数 = 获取数据("山体参数");
        va.生态群落参数 = 获取数据("生态群落参数");
        va.矿物生成 = 获取数据("矿物生成");
        va.树木生成 = 获取数据("树木生成");
        va.森林地表矿参数 = 获取数据("森林地表矿参数");

        参数信息 = va;
        加载完成();
        return va;
    }
}
